package cn.jnetty.ioc.definition;

import cn.jnetty.api.annotation.JBean;
import cn.jnetty.api.exception.JnettyIocException;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author 猪哥亮
 * @email 1030681978@qq.com
 * @date 2020/4/3 19:20
 * 描述：这个主要作用在方法上，有这个注解的将会执行这个方法并返回对象之后放到容器中
 * 如果有参数则到容器中获取参数主要配合JConfiguration使用
 */
public class JBeanDefinition extends JDefaultBeanDefinition {
    private Method method;
    private Object obj;

    public JBeanDefinition(JBean bean, Method method, Object obj) {
        super(bean,obj.getClass());
        this.method = method;
        this.obj = obj;
        init();
    }

    @Override
    protected void init() {
        try {
            method.setAccessible(true);
            Object[] args = null;
            Class<?>[] parameterTypes = method.getParameterTypes();
            if(parameterTypes != null && parameterTypes.length != 0){
                args = new Object[parameterTypes.length];
                for(int i = 0;i<parameterTypes.length;i++){
                    args[i] = JDefaultBeanDefinitionFactory.getInstance().getBean(parameterTypes[i]);
                    if(args[i] == null){
                        new JnettyIocException("注入@JBean异常");
                    }
                }
            }
            Object o = method.invoke(obj, args);
            JDefaultBeanDefinitionFactory.getInstance().put(null,o.getClass(),o);
        } catch (IllegalAccessException e) {
            new JnettyIocException("注入@Beany异常",e);
        } catch (InvocationTargetException e) {
            new JnettyIocException("注入@Beany异常",e);
        }
    }
}
